﻿using GACore;
using GACore.InputArgs;
using System;
using System.Collections.Generic;
using System.Xml.Linq;

namespace NQueensProblem
{
	class Program
	{
		static void Main(string[] args)
		{
			try
			{
				if (args == null || args.Length == 0)
				{
					throw new ArgumentException("Es wurde keine Einstellungsdatei übergeben." + Environment.NewLine + "Bitte übergeben Sie den Pfad zur Einstellungsdatei als Parameter in der Kommandozeile.");
				}
				Persistence peristence = new Persistence(args[0]);
				Controller controller = Controller.Instance;
				controller.Init(peristence.Load(AddVectorLengthPreference), new NQueensProblem((int)peristence.IndividualPreferences["VectorLength"]));
				controller.Optimize();
			}
			catch (Exception ex)
			{
				Console.WriteLine("Es ist ein Fehler mit folgender Meldung aufgetreten:" + Environment.NewLine + ex.Message);
			}
		}

		static void AddVectorLengthPreference(XElement root, ref Dictionary<string, object> prefs)
		{
			prefs.Add("VectorLength", GetElementAsInt(root, "VectorLength"));
		}

		private static int GetElementAsInt(XElement root, string elementName)
		{
			try
			{
				return (int)root.Element(elementName);
			}
			catch
			{
				throw new ArgumentException("Das Element " + root.Name + " ist kein Integer.");
			}
		}
	}
}
